package com.hudilao.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hudilao.common.R;
import com.hudilao.dto.*;
import com.hudilao.entity.Order;
import com.hudilao.vo.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface OrderService extends IService<Order> {

    /**
     * 用户下单
     * @param orderSubmitDTO
     */
    public OrderSubmitVO submit(OrderSubmitDTO orderSubmitDTO, long customerId);

    /**
     * 用户付款
     * @param orderPaymentDTO
     * @return
     */
    public OrderPaymentVO pay(OrderPaymentDTO orderPaymentDTO) throws Exception;

    /**
     * 用户使用余额付款
     * @param orderPaymentDTO
     * @return
     */
    public R<OrderBalancePaymentVO> payByBalance(OrderPaymentDTO orderPaymentDTO);

    /**
     * 用户付款后更新订单状态，支付方式，完成时间
     * @param id
     * @param status
     * @param paymentMethod
     * @param completeTime
     */
    public void updateByIdAfterPay(Long id,Integer status, Integer paymentMethod, LocalDateTime completeTime);

    /**
     * 根据用户id获取历史订单
     * @param customerId
     * @return
     */
    public List<OrderHistoryVO> getOrdersById(long customerId);

    /**
     * 用户端查看历史订单详情：根据订单id获取该订单详情
     * @param orderId 订单id
     * @return 历史订单详情
     */
    public OrderHistoryVO getOrderById(long orderId);


    /**
     * 用户评价后更新订单状态
     * @param id
     */
    public void updateStatusByIdAfterReview(long id,Integer status);


    //管理端

    /**
     * 订单分页查询
     * @param page
     * @param pageSize
     * @param username
     */
    public Page<OrderDTO> getOrdersByUsername(int page, int pageSize, String username) ;


    /**
     * 更新订单状态
     * @param order
     */
    public R<String> updateOrderStatus(Order order);


    /**
     * 查看订单详情
     * @param orderId
     */
    public OrderDetailDTO getOrderDetails(Long orderId);


    /**
     * 订单分页查询
     * 根据status筛选订单
     * @param page
     * @param pageSize
     * @param status
     */
    public Page<OrderDTO> getOrdersByStatus(int page, int pageSize, Integer status);

    /**
     * 订单数量查询
     * 根据status筛选订单
     */
    public int[] getOrderStatusCount();
}
